<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
require_once "java/util/Arrays.php";
/**
 * Description of KaynakYukleyici
 *
 * @author Sedat Sevgili
 */
class KaynakYukleyici {
    //put your code here
    
    private final $encoding;
    
    private static final $bomBytes = array(0xef, 0xbb, 0xbf);
    
    function __construct() {
        $args = func_get_args();
        $argCount = count($args);
        if($argCount == 0) {
            $this->encoding = "UTF-8";
        } else if ($argCount == 1) {
            $this->encoding = strtoupper($args[0]);
        }
    }
    
    public function getReader($kaynakAdi) {
        $is = @fopen($kaynakAdi, 'r');
        if(!$is) {
            throw new Exception($kaynakAdi . ' erisimi saglanamadi. Elde edilen stream degeri null!');
        }
        return $is;
    }
    
    public function kaynakMevcutMu($kaynakAdi) {
        if(!file_exists($kaynakAdi)) {
            return false;
        }
        if(!is_readable($kaynakAdi)) {
            throw new Exception('Güvenlik hatasi nedeniyle ' . $kaynakAdi . ' dosyasina erisim mumkun degil');
        }
        return true;
    }
    
    public function utf8BomDenetle($is) {
        if(is_null($is)) {
            throw new Exception('inputStream is null. throwing exception');
        }
        if(!is_null($this->encoding) && strtoupper($this->encoding) != 'UTF-8') {
            return $is;
        }
        $pis = clone $is;
        if(($okunanBom = fread($pis, count(self::$bomBytes))) === false) {
            return $is;
        }
        fclose($is);
        if(!Arrays::equals($okunanBom, self::$bomBytes)) {
            rewind($pis);   // burada fseek($pis, 0 - count(self::$bomBytes), SEEK_CUR); de kullanılabilir, emin değilim. 
        }
        return $pis;
    }
    
    public function getStream($kaynakAdi) {
        $stream = $this->utf8BomDenetle(fopen($kaynakAdi, "r"));
        if($stream < 0 || is_null($stream)) {
            throw new Exception("Kaynak erisim hatasi: " . $kaynakAdi);
        }
        return $stream;
    }
    
    public function kodlamaliOzellikDosyasiOku($dosyaAdi) {
        $reader = $this->getReader($dosyaAdi);
        $ozellikler = array();
        while(!feof($reader)) {
            $line = fgets($reader);
            $line = trim($line);
            if(count($line) == 0 || strpos($line, '#') === 0) {
                continue;
            }
            $esitlik = strpos($line, '=');
            if($esitlik === false) {
                throw new Exception('Özellik satırında = simgesi bekleniyordu');
            }
            $key = trim(substr($line, 0, $esitlik));
            if(count($line) > $esitlik - 1) {
                $ozellikler[$key] = trim(substr($line, $esitlik + 1));
            } else {
                $ozellikler[$key] = '';
            }
        }
        fclose($reader);
        return $ozellikler;
    }
    
    public function konfigurasyonYukle($dosya) {
        $props = parse_ini_file($dosya);
        if($props === false) {
            throw new Exception('ini dosyası okumada hata');
        }
    }
}